//################################################################################
// MIT License
// Copyright (c) 2024 ZhangYihua
//
// Change Logs:
// Date           Author       Notes
// 2020-01-16     ZhangYihua   first version
//
// Description  : 
//################################################################################

module rst_sync #(
parameter           SYNC_NUM                = 3         // synchronization pipeline number for each bit
) ( 
input                                       rst_async_n,    // before synchronization
input                                       clk,
output                                      rst_sync_n      // after synchornization
);

//################################################################################
// define local varialbe and localparam
//################################################################################

wire                [SYNC_NUM+1-1:0]        q_meta;

//################################################################################
// main
//################################################################################

assign q_meta[0] = 1'b1;

genvar gi;
generate for (gi=0; gi<SYNC_NUM; gi=gi+1) begin:G_NUM
        meta_dff_wrap #(
                .INI        (1'b0               )
        ) u_meta_dff ( 
                .rst_n      (rst_async_n        ),
                .clk        (clk                ),

                .d          (q_meta[gi  ]       ),
                .q          (q_meta[gi+1]       )
        );
end endgenerate

assign rst_sync_n = q_meta[SYNC_NUM];

//################################################################################
// ASSERTION
//################################################################################

`ifdef CBB_ASSERT_ON
// synopsys translate_off


// synopsys translate_on
`endif

endmodule
